#!/usr/bin/python
# -*- coding: utf8 -*-

import commands
import token
import pprint
import nltk
import re
import pprint

class Lexico:
    arquivo = ''
    analisador = '/home/celso/tree-tagger/cmd/tree-tagger-portuguese'
    pedacos = []
    
    def __init__(self, arquivo):
        self.arquivo = arquivo
    
    def CarregarArquivo(self):
        texto = ''
        texto = commands.getoutput(self.analisador + ' ' + self.arquivo)
        return self.Processar(texto)
    
    def Processar(self, texto):
        #texto = ''
        #texto = commands.getoutput(self.analisador + ' ' + self.arquivo)
        grupo = texto.split('\n')
        for linha in grupo:
            classificacao = linha.split('\t')
            if len(classificacao) == 2:
                self.pedacos += [token.Token(classificacao[0], classificacao[1], '')]
            elif len(classificacao) == 3:
                self.pedacos += [token.Token(classificacao[0], classificacao[1], classificacao[2])]
        # retira os  2 primeiros pedacos e o ultimo
        self.pedacos = self.pedacos[2:len(self.pedacos) - 1]
        
        estrutura = self.Refinamento()
        
        return estrutura
        
    def Refinamento(self):
        
        equipes = ["Palmeiras", "Bragantino", "São Caetano", "Santos", "Ponte Preta", "Marília", "Barueri", "São Paulo", "Guaratinguetá", "Ituano", "Guarani", "Portuguesa", "Sertãozinho", "Rio Preto", "Corinthians", "Noroeste", "Rio Claro", "Mirassol", "Juventus"]
        estadios = ["Palestra Itália", "Anísio Haddad","Moisés Lucarelli", "Jayme Cintra", "Bento de Abreu", "Morumbi", "Arena Barueri", "Frederico Dalmazo", "Brinco de Ouro", "Alfredo de Castilho", "Santa Cruz"]
        cidades = ["São Paulo", "Barueri", "Guaratinguetá", "Campinas", "Bauru", "Ribeirão Preto", "Marília", "Santos", "São José do Rio Preto"]
        
        estrutura = []
        
        # buffer para o analisador léxico
        buffer_lexico = ''
        
        pilha_lexica = []
        
        # se achou alguma candidato a equipe, cidade ou estadio
        achou_Equipe_Estadio_Cidade = False
        achou_Equipe = False
        achou_Estadio = False
        achou_Cidade = False
        
        # marcador para inserir as tags, EQUIPE, ESTADIO ou CIDADE
        inserir_Equipe = False
        inserir_Estadio = False
        inserir_Cidade = False
        
        # passeia por cada Token
        for t in self.pedacos:
            
            # Expressão regular para Tempo ( HH:MM ) e data ( DD/MM/AAAA )
            tempoRegEx = re.compile('\d\d[h:]\d\dm?', re.IGNORECASE)
            dataRegEx = re.compile('\d\d[\/]\d\d([\/]\d\d(\d\d)?)?', re.IGNORECASE)
            resultadoRegEx = re.compile('\d[ax-]\d(.?)', re.IGNORECASE)
            
            if tempoRegEx.search( t.pedaco ):
                t.morfo = 'TEMPO'
                estrutura += [(t.pedaco,t.morfo)]
            elif dataRegEx.search( t.pedaco ):
                t.morfo = 'DATA'
                estrutura += [(t.pedaco,t.morfo)]
            elif resultadoRegEx.search( t.pedaco ):
                estrutura += [(t.pedaco[0],'CARD')]
                estrutura += [(t.pedaco[1],'PRP')]
                estrutura += [(t.pedaco[2],'CARD')]
            else:
                
                if buffer_lexico == "":
                    buffer_lexico = t.pedaco
                    pilha_lexica.append((t.pedaco,t.morfo))
                else:
                     buffer_lexico += " " + t.pedaco
                     pilha_lexica.append((t.pedaco,t.morfo))
                
                ####################################################################################
                ## Estrutura para procurar Equipes
                ####################################################################################
                for equipe in equipes:
                    if equipe.lower().startswith(buffer_lexico.lower()):
                        # guarda pedaços nos buffer de segurança
                        # implantar
                        
                        achou_Equipe_Estadio_Cidade = True
                        achou_Equipe = True
                        
                        if buffer_lexico.lower() == equipe.lower():
                            inserir_Equipe = True
                            buffer_lexico = equipe
                            break
                        break
                    elif achou_Equipe == True:
                        achou_Equipe = False
                    
                ####################################################################################
                ## Estrutura para procurar Estádios
                ####################################################################################
                for estadio in estadios:
                    estadio = 'estádio ' + estadio
                    if estadio.lower().startswith(buffer_lexico.lower()):
                        # guarda pedaços nos buffer de esegurança
                        # implantar
                        
                        achou_Equipe_Estadio_Cidade = True
                        achou_Estadio = True
                        
                        if buffer_lexico.lower() == estadio.lower():
                            inserir_Estadio = True
                            buffer_lexico = estadio[8:]
                            break
                        break
                    elif achou_Estadio == True:
                        achou_Estadio = False
                
                ####################################################################################
                ## Estrutura para procurar Cidades
                ####################################################################################
                for cidade in cidades:
                    if cidade.startswith(buffer_lexico):
                        # guarda pedaços nos buffer de segurança
                        # implantar
                        
                        achou_Equipe_Estadio_Cidade = True
                        achou_Cidade = True
                        
                        if buffer_lexico == cidade:
                            inserir_Cidade = True
                            buffer_lexico = cidade
                            break
                        break
                    elif achou_Cidade == True:
                        achou_Cidade = False
                
                ####################################################################################
                ## Marca como Equipe, Estadio ou Cidade
                ####################################################################################
                #if achou_Equipe_Estadio_Cidade == False and inserir_Equipe == False and inserir_Estadio == False and inserir_Cidade == False:
                if achou_Cidade == False and achou_Estadio == False and achou_Equipe == False:
                    # esvazia buffer
                    # implantar
                    
                    buffer_lexico = ""
                    #estrutura += [(t.pedaco,t.morfo)]
                    #pilha_lexica.reverse()
                    for elemento in pilha_lexica:
                        estrutura += [elemento]
                    pilha_lexica = []
                    
                    achou_Equipe_Estadio_Cidade = False
                    inserir_Cidade = False
                    inserir_Estadio = False
                    inserir_Equipe = False
                    
                    achou_Cidade = False
                    achou_Estadio = False
                    achou_Equipe = False
                
                #if achou_Equipe_Estadio_Cidade == True and inserir_Equipe == True and inserir_Cidade == False:
                if achou_Equipe == True and inserir_Equipe == True and inserir_Cidade == False:
                    
                    estrutura += [(buffer_lexico.replace(' ', ''),"EQUIPE")]
                    pilha_lexica = []
                    buffer_lexico = ""
                    inserir_Equipe = False
                    inserir_Estadio = False
                    inserir_Cidade = False
                    achou_Equipe_Estadio_Cidade = False
                    
                    achou_Cidade = False
                    achou_Estadio = False
                    achou_Equipe = False
                    
                #if achou_Equipe_Estadio_Cidade == True and inserir_Estadio == True:
                if achou_Estadio == True and inserir_Estadio == True:
                    
                    estrutura += [(buffer_lexico.replace(' ', ''),"ESTADIO")]
                    pilha_lexica = []
                    buffer_lexico = ""
                    inserir_Equipe = False
                    inserir_Estadio = False
                    inserir_Cidade = False
                    achou_Equipe_Estadio_Cidade = False
                    
                    achou_Cidade = False
                    achou_Estadio = False
                    achou_Equipe = False
                
                if achou_Cidade == True and inserir_Equipe == False and inserir_Cidade == True:
                #if achou_Equipe_Estadio_Cidade == True and inserir_Equipe == False and inserir_Cidade == True:
                    
                    estrutura += [(buffer_lexico.replace(' ', ''),"CIDADE")]
                    pilha_lexica = []
                    buffer_lexico = ""
                    inserir_Equipe = False
                    inserir_Estadio = False
                    inserir_Cidade = False
                    achou_Equipe_Estadio_Cidade = False
                    
                    achou_Cidade = False
                    achou_Estadio = False
                    achou_Equipe = False
                                       
                #if achou_Equipe_Estadio_Cidade == True and inserir_Cidade == True and inserir_Equipe == True:
                if achou_Cidade == True and achou_Equipe == True and inserir_Cidade == True and inserir_Equipe == True:
                    
                    estrutura += [(buffer_lexico.replace(' ', ''),"EQUIPE-CIDADE")]
                    pilha_lexica = []
                    buffer_lexico = ""
                    inserir_Equipe = False
                    inserir_Estadio = False
                    inserir_Cidade = False
                    achou_Equipe_Estadio_Cidade = False
                    
                    achou_Cidade = False
                    achou_Estadio = False
                    achou_Equipe = False                
                
        return estrutura
        